package com.hcryan.djm.feign.response;

import lombok.Data;

import java.util.List;

/**
 * @author ryanwdj
 * @since 2025/2/23
 */
@Data
public class DrivingResp {
    /**
     * 本次API访问状态，如果成功返回0，如果失败返回其他数字。
     */
    private int status;

    /**
     * 对API访问状态值的英文说明，如果成功返回ok，并返回结果字段，如果失败返回错误说明。
     */
    private String message;

    /**
     * 返回的结果
     */
    private Result result;

    @Data
    public static class Result {

        /**
         * 起点信息
         */
        private Location origin;

        /**
         * 终点信息
         */
        private Location destination;

        /**
         * 返回的方案集
         */
        private List<Route> routes;
    }

    @Data
    public static class Route {
        private String route_md5;
        /**
         * 方案距离，单位：米
         */
        private int distance;

        /**
         * 线路耗时，单位：秒
         */
        private int duration;

        /**
         * 路线的过路费预估，单位：元
         */
        private double toll;

        /**
         * 路线的整体路况评价
         * 取值范围：
         * 0：无路况
         * 1：畅通
         * 2：缓行
         * 3：拥堵
         * 4：严重拥堵
         */
        private int traffic_condition;

        /**
         * 限行信息
         */
        private RestrictionInfo restriction_info;

        /**
         * 路线分段
         */
        private List<Step> steps;
    }

    @Data
    public static class RestrictionInfo {
        /**
         * 限行状态
         * 0：不限行
         * 1：已规避限行的路线合法
         * 2：无法规避限行的非法路线
         */
        private int status;
    }

    @Data
    public static class Step {
        /**
         * 途经点序号
         * 途经点序号为从0开始的整数，用于标识step所属的途经点路段
         * 如：若该step属于起点至第一个途经中的路段，则其leg_index为0
         */
        private int leg_index;

        /**
         * 进入道路的角度
         * 枚举值，返回值在0-11之间的一个值，共12个枚举值，以30度递进，即每个值代表角度范围为30度；
         * 其中返回"0"代表345度到15度，以此类推，返回"11"代表315度到345度"；
         * 分别代表的含义是：
         * 0-[345°-15°]；1-[15°-45°]；2-[45°-75°]；3-[75°-105°]；4-[105°-135°]；
         * 5-[135°-165°]；6-[165°-195°]；7-[195°-225°]；8-[225°-255°]；
         * 9-[255°-285°]；10-[285°-315°]；11-[315°-345°]
         * 注：角度为与正北方向顺时针夹角
         */
        private int direction;

        /**
         * 机动转向点，包括基准八个方向、环岛、分歧等
         * 枚举值，返回0-16之间的一个值，共17个枚举值。分别代表的含义是：
         * 0：无效
         * 1：直行
         * 2：右前方转弯
         * 3：右转
         * 4：右后方转弯
         * 5：掉头
         * 6：左后方转弯
         * 7：左转
         * 8：左前方转弯
         * 9：左侧
         * 10：右侧
         * 11：分歧-左
         * 12：分歧中央
         * 13：分歧右
         * 14：环岛
         * 15：进渡口
         * 16：出渡口
         */
        private int turn;

        /**
         * 路段距离，单位：米
         */
        private int distance;

        /**
         * 路段耗时，单位：秒
         */
        private int duration;

        /**
         * 分段的道路类型（该字段后续将废弃，由road_types代替）
         * 枚举值：返回0-9之间的值
         * 0：高速路
         * 1：城市高速路
         * 2：国道
         * 3：省道
         * 4：县道
         * 5：乡镇村道
         * 6：其他道路
         * 7：九级路
         * 8：航线(轮渡)
         * 9：行人道路
         */
        private int road_type;

        /**
         * 路段途经的道路类型列表
         * 若途经多个路段类别，将用英文逗号","分隔，如：
         * - 该路段依次途经国道和省道两种道路类型，则road_types:"2,3"
         * - 该路段仅途经高速，则road_types:"0"
         * road_types取值范围：
         * 0：高速路
         * 1：城市高速路
         * 2：国道
         * 3：省道
         * 4：县道
         * 5：乡镇村道
         * 6：其他道路
         * 7：九级路
         * 8：航线(轮渡)
         * 9：行人道路
         */
        private String road_types;

        /**
         * 路段描述
         */
        private String instruction;

        /**
         * 分段起点坐标
         */
        private Location start_location;

        /**
         * 分段终点坐标
         */
        private Location end_location;

        /**
         * 分段坐标
         */
        private String path;

        /**
         * 分段路况详情
         */
        private List<TrafficCondition> traffic_condition;
    }

    @Data
    public static class TrafficCondition {
        /**
         * 路况指数
         * 取值范围：
         * 0：无路况
         * 1：畅通
         * 2：缓行
         * 3：拥堵
         * 4：严重拥堵
         */
        private int status;

        /**
         * 从当前坐标点开始，path中路况相同的坐标点个数
         */
        private int geo_cnt;
    }
}
